/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */
const db = require('../db/index')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const config = require('../config')

var isERR = false
// ============================================================
// 注册的处理函数
exports.register = (req, res) => {
  // 获取客户端提交到服务器的用户信息
  const userinfo = req.body

  // 判断数据是否合法,后端再次校验数据
  // if (!userinfo.username || !userinfo.password) {
  //     // return res.send({ status: 1, message: '用户名或密码不合法!' })
  //     return  res.cc('用户名或密码不合法!')
  // }

  // 查看用户是否已经存在
  const sql_uid_seek = 'select * from users_mt where uid=?'
  db.query(sql_uid_seek, [userinfo.uid], (err, results) => {
    // 执行 SQL 语句失败
    if (err) {
      return res.cc(err)  // 优化后
    }
    // results 数据库查询后的结果数组
    // 判断用户名是否被占用
    if (results.length > 0) {
      isERR = true
      console.log(111);
      return res.cc('用户被占用，请更换其他用户名!')
    }
  })
  // 查询手机号是否存在冲突
  const sql_mobile_seek = 'select * from users_mt where mobile=?'
  db.query(sql_mobile_seek, [userinfo.mobile], (err, results) => {
    // 执行 SQL 语句失败
    if (err) {
      return res.cc(err)  // 优化后
    }
    // results 数据库查询后的结果数组
    // 判断用户名是否被占用
    if (results.length > 0) {
      isERR = true
      console.log(222);
      return res.cc('手机号已存在，请检查手机号是否输入正确!')
    }
  })

  // 对用户的密码,进行 bcrype 加密，返回值是加密之后的密码字符串
  // userinfo.password = bcrypt.hashSync(userinfo.password, 10)

  // 插入新用户
  const sql_user_insert = 'insert into users_mt set ?'
  db.query(sql_user_insert, {
    uid: userinfo.uid,
    username: userinfo.username,
    password: userinfo.password,
    mobile: userinfo.mobile,
    mailbox: userinfo.mailbox,
    role: userinfo.role,
    perid: userinfo.perid
  }, (err, results) => {
    // 执行 SQL 语句失败
    if (err) return res.cc(err)  // 优化后
    // SQL 语句执行成功，但影响行数不为 1
    if (results.affectedRows !== 1) {
      return res.cc('注册用户失败，请稍后再试!')
    }

    // 注册成功
    // res.send({ status: 0, message: '注册成功!' })
    res.cc('注册成功!', 0)
  })

}

// ===========================================================
// 登录的处理函数
exports.login = (req, res) => {
  const userinfo = req.body
  const sql_uid_seek = `select * from users_mt where uid=?`
  db.query(sql_uid_seek, [userinfo.uid], (err, results) => {
    if (err) {  // 执行 SQL 语句失败
      return res.cc(err)  // 优化后
    }
    if (results.length != 1) {   // 如果 results.length 为 0 则用户不存在或是未注册
      return res.cc('用户未注册，登录失败!')
    }
    console.log('用户验证成功!')

    // 拿着用户输入的密码,和数据库中存储的密码进行对比   compareResult 是一个boolean值，true为成功，false为失败 
    // const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
    const compareResult = userinfo.password === results[0].password
    // 如果登录失败   如果对比的结果等于 false, 则证明用户输入的密码错误
    if (!compareResult) {
      return res.cc("登录失败,密码错误!")
    }
    console.log('密码验证成功!');

    // 如果登录成功   则生成Token字符串
    // 剔除密码，手机号，邮箱等敏感信息 用于生成不携带敏感信息的token

    console.log(results[0]);
    const user = { ...results[0], password: '', mobile: '', mailbox: '' }
    // 对用户信息进行加密，生成 Token 字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
    console.log('生成 Token 字符串:');
    // console.log(tokenStr);

    res.send({
      status: 0,
      message: '登录成功!',
      token: 'Bearer ' + tokenStr,
    })
  })
}
